/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.recursos.controlador;

import com.recursos.beans.DataBaseHelper;
import com.recursos.beans.FacadeUSuario;
import com.recursos.entidades.Ciudad;
import com.recursos.entidades.Perfil;
import com.recursos.entidades.TipoUsuario;
import com.recursos.entidades.Usuario;
import com.recursos.modelo.DatosUsuario;
import com.recursos.view.utilidades.Log;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.validation.constraints.NotNull;
import org.primefaces.context.RequestContext;

/**
 *
 * @author MARA
 */
@ManagedBean(name = "accionesUsuario")
@ViewScoped
public class AccionesUsuario extends Log implements Serializable {

    @EJB
    FacadeUSuario facadeUsuario;
    @EJB
    DataBaseHelper baseHelper;
    private List<Usuario> listUsuario;
    private Usuario usuario = new Usuario();
    private Usuario usuarioSelect;
    @NotNull(message = "Seleccione un tipo de busqueda")
    private String tipoBusqueda;
    private String valorBusqueda;
    private String idPerfil;
    private String idCiudad;
    private String idTipoUsuario;
    private List<Ciudad> listCiudad;
    private List<TipoUsuario> listTipoUsuario;
    private List<Perfil> listPerfil;    
    
    public AccionesUsuario() {

    }

    /**
     * Creates a new instance of AccionesUsuario
     */
    public String getIdPerfil() {
        return idPerfil;
    }

    public void setIdPerfil(String idPerfil) {
        this.idPerfil = idPerfil;
    }

    public String getIdCiudad() {
        return idCiudad;
    }

    public void setIdCiudad(String idCiudad) {
        this.idCiudad = idCiudad;
    }

    public String getIdTipoUsuario() {
        return idTipoUsuario;
    }

    public void setIdTipoUsuario(String idTipoUsuario) {
        this.idTipoUsuario = idTipoUsuario;
    }

    public String getValorBusqueda() {
        return valorBusqueda;
    }

    public void setValorBusqueda(String valorBusqueda) {
        this.valorBusqueda = valorBusqueda;
    }

    public DataBaseHelper getBaseHelper() {
        return baseHelper;
    }

    public void setBaseHelper(DataBaseHelper baseHelper) {
        this.baseHelper = baseHelper;
    }

    public List<Usuario> getListUsuario() {
        return listUsuario;
    }

    public void setListUsuario(List<Usuario> listUsuario) {
        this.listUsuario = listUsuario;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public String getTipoBusqueda() {
        return tipoBusqueda;
    }

    public void setTipoBusqueda(String tipoBusqueda) {
        this.tipoBusqueda = tipoBusqueda;
    }

    public List<Ciudad> getListCiudad() {
        DatosUsuario datos = (DatosUsuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(ControladorLogin.USER_SESSION_KEY);
        listCiudad = baseHelper.getList(datos, Ciudad.class);
        return listCiudad;
    }

    public void setListCiudad(List<Ciudad> listCiudad) {
        this.listCiudad = listCiudad;
    }

    public List<TipoUsuario> getListTipoUsuario() {
        DatosUsuario datos = (DatosUsuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(ControladorLogin.USER_SESSION_KEY);
        listTipoUsuario = baseHelper.getList(datos, TipoUsuario.class);
        return listTipoUsuario;
    }

    public void setListTipoUsuario(List<TipoUsuario> listTipoUsuario) {
        this.listTipoUsuario = listTipoUsuario;
    }

    public List<Perfil> getListPerfil() {
        DatosUsuario datos = (DatosUsuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(ControladorLogin.USER_SESSION_KEY);
        listPerfil = baseHelper.getList(datos, Perfil.class);
        return listPerfil;
    }

    public void setListPerfil(List<Perfil> listPerfil) {
        this.listPerfil = listPerfil;
    }

    public Usuario getUsuarioSelect() {
        return usuarioSelect;
    }

    public void setUsuarioSelect(Usuario usuarioSelect) {
        this.usuarioSelect = usuarioSelect;
    }

    public void findName(ActionEvent actionEvent) {
        FacesMessage msg;
        DatosUsuario datos = (DatosUsuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(ControladorLogin.USER_SESSION_KEY);
        if ("id".equals(tipoBusqueda)) {
            listUsuario = baseHelper.findByIdList(datos, Usuario.class, valorBusqueda);

        } else {
            if (("nombre").equals(tipoBusqueda)) {
                listUsuario = facadeUsuario.getFindByName(datos, valorBusqueda);
            }
        }
        if (listUsuario == null) {
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje", "La busqueda no "
                    + "genero ningun resultado");
        } else {
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje", "Consulta"
                    + " realizada con exito");
        }
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void guardar(ActionEvent actionEvent) {
        RequestContext ctx = RequestContext.getCurrentInstance();
        DatosUsuario datos = (DatosUsuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(ControladorLogin.USER_SESSION_KEY);
        FacesMessage msg = null;
        
        try {
            Ciudad ciudadaux = (Ciudad) baseHelper.findById(datos, Ciudad.class, idCiudad);
            Perfil perfilaux = (Perfil) baseHelper.findById(datos, Perfil.class, idPerfil);
            TipoUsuario tipoUsuarioAux = (TipoUsuario) baseHelper.findById(datos, TipoUsuario.class, idTipoUsuario);
            usuario.setIdCiudad(ciudadaux);
            usuario.setIdTipoUsuario(tipoUsuarioAux);
            usuario.setPerfilUsuario(perfilaux);
            //valida si el usuario existe
            if (baseHelper.findById(datos, Usuario.class, usuario.getIdUsuario().toString()) == null) {
                baseHelper.create(datos, usuario);
                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje", "Se gu"
                        + "ardo correctamente el usuario");
            }else{
                msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Mensaje", "Ya "
                        + "existe el id en base de datos");
            }
        } catch (Exception e) {
            loggerD.error("Error guardando el usuario :" + usuario.getIdUsuario());
            loggerD.error(e.getMessage() + "\n" + e.toString());
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Error", "No se ha guardado"
                    + " el usuario");
        }
        ctx.addCallbackParam("ValidacionOK", true);
        FacesContext.getCurrentInstance().addMessage(null, msg);
         
    }

    public void modificar(ActionEvent actionEvent) {
        RequestContext ctx = RequestContext.getCurrentInstance();
        DatosUsuario datos = (DatosUsuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(ControladorLogin.USER_SESSION_KEY);
        FacesMessage msg = null;
        try {
            Ciudad ciudadaux = (Ciudad) baseHelper.findById(datos, Ciudad.class, usuarioSelect.getIdCiudad().getIdCiudad().toString());
            Perfil perfilaux = (Perfil) baseHelper.findById(datos, Perfil.class, usuarioSelect.getIdCiudad().getIdCiudad().toString());
            TipoUsuario tipoUsuarioAux = (TipoUsuario) baseHelper.findById(datos, TipoUsuario.class, usuarioSelect.getIdCiudad().getIdCiudad().toString());
            usuarioSelect.setIdCiudad(ciudadaux);
            usuarioSelect.setIdTipoUsuario(tipoUsuarioAux);
            usuarioSelect.setPerfilUsuario(perfilaux);
            baseHelper.save(datos, usuarioSelect);
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje", "Se mo"
                    + "difico correctamente el usuario");
        } catch (Exception e) {
            loggerD.error("Error guardando el usuario :" + usuario.getIdUsuario());
            loggerD.error(e.getMessage());
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Error", "No se ha modificado"
                    + " el usuario");
        }
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void eliminar(ActionEvent actionEvent) {
        DatosUsuario datos = (DatosUsuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(ControladorLogin.USER_SESSION_KEY);
        RequestContext ctx = RequestContext.getCurrentInstance();
        FacesMessage msg = null;
        try {
            
            baseHelper.delete(datos,usuarioSelect.getIdUsuario(), Usuario.class );
            listUsuario.remove(usuarioSelect);
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje", "Se eli"
                    + "mino correctamente el usuario");
        } catch (Exception ex) {
            loggerD.error("Error modificando el usuario: " + usuario.getIdUsuario());
            loggerD.error(ex.getMessage());
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Error", "No se ha eliminado"
                    + " el usuario");
        }
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
}
